﻿-----------------------------------------------------------------------------------------------
-----------------------------------pca_clientes.clientes---------------------------------------
-----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_clientes.fn_add_empresa
				(bigint,--sesion_id $1
				varchar,--pais_id $2
				varchar,--doc_identidad_id $3
				varchar,--num_doc_identidad $4
				varchar,--nombre $5
				varchar,--direccion $6
				varchar,--telefono $7
				varchar --email $8
				)RETURNS bigint AS
$$
BEGIN
	$5 = initcap(trim(both ' ' from $5));
	$6 = initcap(trim(both ' ' from $6));
	$8 = lower(trim(both ' ' from $8));
	
	INSERT INTO pca_clientes.empresas
		(sesion_id,
		pais_id,
		doc_identidad_id,
		num_doc_identidad,
		nombre,
		direccion,
		telefono,
		email)
	VALUES
		($1,$2,$3,$4,$5,$6,$7,$8);

	RETURN  pca_global.fn_pseudo_encrypt_bigint(currval('pca_clientes.seq_empresa_id')::integer);
EXCEPTION
	WHEN unique_violation THEN
		RAISE EXCEPTION 'Numero de documento repetido';
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_update_empresa
				(bigint,--empresa_id $1
				bigint,--sesion_id $2
				varchar,--pais_id $3
				varchar,--doc_identidad_id $4
				varchar,--num_doc_identidad $5
				varchar,--nombre $6
				varchar,--direccion $7
				varchar,--telefono $8
				varchar,--email $9
				boolean --activo $10
				)RETURNS void AS
$$
BEGIN
	$6 = initcap(trim(both ' ' from $6));
	$7 = initcap(trim(both ' ' from $7));
	$9 = lower(trim(both ' ' from $9));

	UPDATE pca_clientes.empresas SET
		sesion_id=$2,
		pais_id=$3,
		doc_identidad_id=$4,
		num_doc_identidad=$5,
		nombre=$6,
		direccion=$7,
		telefono=$8,
		email=$9,
		activo=$10
	WHERE
		empresa_id=$1;
EXCEPTION
	WHEN unique_violation THEN
		RAISE EXCEPTION 'Numero de documento repetido';
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_del_empresa
				(bigint --empresa_id $1
				)RETURNS void AS
$$
BEGIN
	DELETE FROM 
		pca_clientes.empresas
	WHERE
		empresa_id=$1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_get_empresa(bigint --empresa_id $1
						       )RETURNS pca_clientes.vw_empresas AS
$$
DECLARE
	_row pca_clientes.vw_empresas%ROWTYPE;
BEGIN
	SELECT
		empresa_id,
		sesion_id,
		pais_id,
		pais,
		doc_identidad_id,
		doc_identidad,
		num_doc_identidad,
		nombre,
		direccion,
		telefono,
		email,
		fecha_registro,
		activo
	INTO
		_row
	FROM
		pca_clientes.vw_empresas
	WHERE
		empresa_id=$1;

	IF(FOUND)THEN
		RETURN _row;
	ELSE
		RAISE EXCEPTION 'No existe cliente con Id = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_get_list_empresas
				(integer,--start $1
				integer --limit $2
				)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			empresa_id,
			sesion_id,
			pais_id,
			pais,
			doc_identidad_id,
			doc_identidad,
			num_doc_identidad,
			nombre,
			direccion,
			telefono,
			email,
			fecha_registro,
			activo
		FROM
			pca_clientes.vw_empresas
		ORDER BY
			fecha_registro ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT 
			count(empresa_id)
		FROM
			pca_clientes.vw_empresas
		WHERE
			empresa_id<>0;
	RETURN NEXT cursor_totalrows;	
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_get_list_empresas
				(integer,--start $1
				integer,--limit $2
				varchar --num_doc_identidad , nombre $3
				)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			empresa_id,
			sesion_id,
			pais_id,
			pais,
			doc_identidad_id,
			doc_identidad,
			num_doc_identidad,
			nombre,
			direccion,
			telefono,
			email,
			fecha_registro,
			activo
		FROM
			pca_clientes.vw_empresas
		WHERE
			lower(pca_global.fn_ascii(num_doc_identidad)) LIKE '%'|| lower(pca_global.fn_ascii($3)) ||'%' OR
			lower(pca_global.fn_ascii(nombre)) LIKE '%'|| lower(pca_global.fn_ascii($3)) ||'%'
		ORDER BY
			fecha_registro ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT 
			count(empresa_id)
		FROM
			pca_clientes.vw_empresas
		WHERE
			lower(pca_global.fn_ascii(num_doc_identidad)) LIKE '%'|| lower(pca_global.fn_ascii($3)) ||'%' OR
			lower(pca_global.fn_ascii(nombre)) LIKE '%'|| lower(pca_global.fn_ascii($3)) ||'%';
	RETURN NEXT cursor_totalrows;	
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_get_list_empresas
				(integer,--start $1
				integer, --limit $2
				varchar[] --filtros $3
				)RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
	sqlfiltro varchar;
	sqlcount varchar;
BEGIN
	sqlfiltro := 
		'SELECT
			empresa_id,
			sesion_id,
			pais_id,
			pais,
			doc_identidad_id,
			doc_identidad,
			num_doc_identidad,
			nombre,
			direccion,
			telefono,
			email,
			fecha_registro,
			activo
		FROM
			pca_clientes.vw_empresas
		WHERE '|| 
			pca_global.fn_get_strfiltro($3)|| 
		' ORDER BY
			fecha_registro ASC LIMIT '|| $2 || ' OFFSET '|| $1 ;

	sqlcount := 
		'SELECT
			count(empresa_id)
		FROM
			pca_clientes.vw_empresas
		WHERE empresa_id<>0 AND '|| 
			pca_global.fn_get_strfiltro($3);
	
	OPEN cursor_result FOR
		EXECUTE(sqlfiltro);
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		EXECUTE(sqlcount);
	RETURN NEXT cursor_totalrows;	
END;
$$
LANGUAGE plpgsql;

-----------------------------------------------------------------------------------------------
-----------------------------------pca_clientes.contactos--------------------------------------
-----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_clientes.fn_add_contacto
				(bigint,--empresa_id $1
				varchar,--nombre $2
				varchar,--telefono $3
				varchar,--email $4
				varchar --observaciones $5
				)RETURNS bigint AS
$$
BEGIN
	$2 = initcap(trim(both ' ' from $2));
	$4 = lower(trim(both ' ' from $4));
	$5 = initcap(trim(both ' ' from $5));

	INSERT INTO pca_clientes.contactos
		(empresa_id,
		nombre,
		telefono,
		email,
		observaciones)
	VALUES
		($1,$2,$3,$4,$5);

	RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_clientes.seq_contacto_id')::integer);
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_update_contacto
				(bigint,--contacto_id $1
				bigint,--empresa_id $2
				varchar,--nombre $3
				varchar,--telefono $4
				varchar,--email $5
				varchar --observaciones $6
				)RETURNS void AS
$$
BEGIN
	$3 = initcap(trim(both ' ' from $3));
	$5 = lower(trim(both ' ' from $5));
	$6 = initcap(trim(both ' ' from $6));

	UPDATE
		pca_clientes.contactos
	SET
		empresa_id=$2,
		nombre=$3,
		telefono=$4,
		email=$5,
		observaciones=$6
	WHERE
		contacto_id=$1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_del_contacto
				(bigint --contacto_id $1
				)RETURNS void AS
$$
BEGIN
	DELETE FROM 
		pca_clientes.contactos
	WHERE
		contacto_id=$1;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_get_contacto(bigint --contacto_id $1
							)RETURNS pca_clientes.contactos AS
$$
DECLARE
	_row pca_clientes.contactos%ROWTYPE;
BEGIN
	SELECT
		contacto_id,
		empresa_id,
		nombre,
		telefono,
		email,
		observaciones
	INTO
		_row
	FROM
		pca_clientes.contactos
	WHERE
		contacto_id = $1;

	IF(FOUND)THEN
		RETURN _row;
	ELSE
		RAISE EXCEPTION 'No existe contacto con Id = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_clientes.fn_get_list_contactos
				(bigint --empresa_id $1
				)RETURNS SETOF pca_clientes.contactos AS
$$
DECLARE
	_row pca_clientes.contactos%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			contacto_id,
			empresa_id,
			nombre,
			telefono,
			email,
			observaciones
		FROM
			pca_clientes.contactos
		WHERE
			empresa_id =$1
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;